home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / PNL Libraries / MyBufferedRead.p < prev    next >
Encoding:
Text File  |  1993-09-02  |  3.1 KB  |  141 lines  |  [TEXT/PJMM]

  1. unit MyBufferedRead;
  2.  
  3. interface
  4.  
  5.     const
  6.         min_buffer_size = 128;
  7.         max_buffer_size = 32000;
  8.  
  9.     type
  10.         bufferedReadFile = ptr;
  11.  
  12.     function BufferReadInit (p: bufferedReadFile; size: longInt; refnum: integer): OSErr;
  13.     function BufferRead (p: bufferedReadFile; data: ptr; var size: longInt): OSErr;
  14.     function BufferReadChar (p: bufferedReadFile): integer;
  15.     function BufferIgnoreTil (p: bufferedReadFile; c1, c2: integer): integer;
  16.     procedure BufferProgress (p: bufferedReadFile; var thru, total: longInt);
  17.  
  18. implementation
  19.  
  20.     const
  21.         buffer_extra = 30;
  22.         max_buffer_size1 = max_buffer_size - 1;
  23.  
  24.     type
  25.         bufferedFile = record
  26.                 rn: integer;
  27.                 max_buffer: integer;
  28.                 bufp, bufmax: integer;
  29.                 total: longInt;
  30.                 buffer: array[0..max_buffer_size1] of signedByte;
  31.             end;
  32.         bufferedFilePtr = ^bufferedFile;
  33.  
  34.     function BufferReadInit (p: ptr; size: longInt; refnum: integer): OSErr;
  35.         var
  36.             oe: OSErr;
  37.     begin
  38.         with bufferedFilePtr(p)^ do begin
  39.             rn := refnum;
  40.             oe := GetEOF(rn, total);
  41.             max_buffer := size - buffer_extra;
  42.             bufp := 0;
  43.             bufmax := 0;
  44.         end;
  45.         BufferReadInit := oe;
  46.     end;
  47.  
  48.     function FillBuffer (p: bufferedReadFile): OSErr;
  49.         var
  50.             oe: OSErr;
  51.             size: longInt;
  52.     begin
  53.         oe := noErr;
  54.         with bufferedFilePtr(p)^ do begin
  55.             if bufmax - bufp < max_buffer then begin
  56.                 if (bufmax - bufp > 0) & (bufp > 0) then
  57.                     BlockMove(@buffer[bufp], @buffer, bufmax - bufp);
  58.                 bufmax := bufmax - bufp;
  59.                 bufp := 0;
  60.                 size := max_buffer - bufmax;
  61.                 oe := FSRead(rn, size, @buffer[bufmax]);
  62.                 bufmax := bufmax + size;
  63.                 if (oe = eofErr) and (bufmax > 0) then
  64.                     oe := noErr;
  65.             end;
  66.         end;
  67.         FillBuffer := oe;
  68.     end;
  69.  
  70.     function BufferRead (p: bufferedReadFile; data: ptr; var size: longInt): OSErr;
  71.         var
  72.             oe: OSErr;
  73.             c: longInt;
  74.     begin
  75.         oe := noErr;
  76.         with bufferedFilePtr(p)^ do begin
  77.             c := bufmax - bufp;
  78.             if c > size then
  79.                 c := size;
  80.             BlockMove(@buffer[bufp], @data, c);
  81.             bufp := bufp + c;
  82.             if size > c then begin
  83.                 size := size - c;
  84.                 oe := FSRead(rn, size, ptr(ord(data) + c));
  85.                 size := size + c;
  86.                 if (oe = eofErr) and (size > 0) then
  87.                     oe := noErr;
  88.             end;
  89.         end;
  90.         BufferRead := oe;
  91.     end;
  92.  
  93.     function BufferReadChar (p: bufferedReadFile): integer;
  94.         var
  95.             oe: OSErr;
  96.     begin
  97.         with bufferedFilePtr(p)^ do begin
  98.             if bufp >= bufmax then
  99.                 oe := FillBuffer(p);
  100.             if bufp >= bufmax then
  101.                 BufferReadChar := -1
  102.             else begin
  103.                 BufferReadChar := BAND(buffer[bufp], $FF);
  104.                 bufp := bufp + 1;
  105.             end;
  106.         end;
  107.     end;
  108.  
  109.     function BufferIgnoreTil (p: bufferedReadFile; c1, c2: integer): integer;
  110.         var
  111.             ch: integer;
  112.     begin
  113.         with bufferedFilePtr(p)^ do begin
  114.             repeat
  115.                 repeat
  116.                     if bufp < bufmax then begin
  117.                         ch := BAND(buffer[bufp], $FF);
  118.                         bufp := bufp + 1;
  119.                     end
  120.                     else
  121.                         ch := BufferReadChar(p);
  122.                 until (ch = c1) or (ch < 0);
  123.                 while ch = c1 do
  124.                     ch := BufferReadChar(p);
  125.             until (ch = c2) or (ch < 0);
  126.         end;
  127.         BufferIgnoreTil := ch;
  128.     end;
  129.  
  130.     procedure BufferProgress (p: bufferedReadFile; var thru, total: longInt);
  131.         var
  132.             oe: OSErr;
  133.     begin
  134.         total := bufferedFilePtr(p)^.total;
  135.         with bufferedFilePtr(p)^ do begin
  136.             oe := GetFPos(rn, thru);
  137.             thru := thru - bufmax + bufp;
  138.         end;
  139.     end;
  140.  
  141. end.